S3 に保存した CloudTrail のログを Athena でクエリしてRoute 53 のレコードをいつ誰が作成したか調査してみた

S3 に保存した CloudTrail のログを Athena でクエリしてRoute 53 のレコードをいつ誰が作成したか調査してみた

Clock Icon2021.12.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、リサリサです。

Amazon Athena で CloudTrail のログを検索してみました。既に↓のように色々ブログは上がっていたのですが、細かいケースについてのブログなら新たに書くのもありかなと思ったので、書いてみました。

やりたいこと

Amazon Athena で S3 に保存されている CloudTrail のログを検索します。

今回は、Route53 のTXTレコードをいつ誰が作成したのかを検索します。

やってみた

Athena のテーブルを作る

CloudTrail のコンソールから作成します。

「イベント履歴」の「Athena テーブルを作成」をクリックします。

そうすると SQL が自動で作成されますので、そのまま「テーブル作成」します。

Athena のクエリエディタを見ると、テーブルが出来ています。

クエリ結果の場所を設定

クエリ結果の保存場所の S3 を設定しないとクエリは実行できないようです。

こちらのメッセージが出ていれば、「設定を表示」から。それか、「設定」からでも同じ画面に遷移します。

「クエリの結果の場所」を「管理」から設定します。

S3 のバスを指定するか、「S3 を参照」からバケットを選択して「保存」します。

検索する

とりあえず、クエリを使ってみる

クエリエディタからクエリを実行します。

テーブルの右の「…」を押すと、とりあえず10行 SELECT できる SQL が出てきます。

SELECT * FROM "default"."cloudtrail_logs_cm_members_123456789012" limit 10;

レコードが取得できました。でも、CloudTrail のログが丸ごと出て、構造化されたカラムは JSON で出力されていて、ちょっと取っつきにくいので、↓のコンソールのイベント履歴に少し寄せてみます。

ユーザー名は、↑の CloudTrail のコンソールの一覧ではマージしてくれているみたいですが、userIdentity.userNameで取得できるのは AssumedRole をしていない純数なユーザー名のようです。AssumedRole していると、ユーザー名は、userIdentity.sessioncontext.sessionissuer.userName になるみたいです。※ちょっと試してみただけなので、まちがってたらすみません…

リソースタイプは resources (ARRAY型でリストの中身が空の場合もあって空だとエラーになる…) の type 、とリソース名は requestparameters の中のリソース固有のカラム (BacketName とか hostedZoneId とか名前が違うから、一律で取得できない…) に入っているので、綺麗に表示できなくて諦めました。でも、CloudTrail 初心者の私にはだいぶ見やすくなりました。

SELECT
eventName as "イベント名"
,eventTime as "イベント時間"
,userIdentity.userName as "ユーザー名"
,userIdentity.sessioncontext.sessionissuer.userName as "ユーザー名(AssumedRole)" 
,eventSource as "イベントソース"
,resources 
,requestparameters 
FROM "default"."cloudtrail_logs_cm_members_123456789012"
limit 10;

本題の検索をしてみる

今回は、Route 53 のレコードをいつ誰が作成したかが知りたいので、

Route 53 のレコードをいつ誰が作成したか検索してみます。

検索は、eventSource = 'route53.amazonaws.com' 、今回はレコードの変更ログを検索したいので、eventName = 'ChangeResourceRecordSets'ドメインが 'test.xxxx.jp' で、レコードタイプが 'TXT' なので、requestparameters にそれぞれが含まれるものを検索してみます。requestparameters の中身をしっかり検索するのは大変そうで諦めてしまいました…

SELECT eventName as "イベント名" 
,eventTime as "イベント時間" 
,userIdentity.userName as "ユーザー名" 
,userIdentity.sessioncontext.sessionissuer.userName as "ユーザー名(AssumedRole)" 
,eventSource as "イベントソース" 
,resources 
,requestparameters 
FROM "default"."cloudtrail_logs_cm_members_123456789012" 
WHERE eventSource = 'route53.amazonaws.com' 
and eventName = 'ChangeResourceRecordSets' 
and requestparameters like '%test.xxxx.jp%'
and requestparameters like '%TXT%'
;

取得できました。誰がいつ作って、いつ削除したのかが分かりました。便利ですね。

requestparameters の中身は、こんな感じなので、TTL や、レコードの中身の value まで分かるようです。

{
    "hostedZoneId": "xxxxxxxx",
    "changeBatch": {
        "changes": [
            {
                "action": "CREATE",
                "resourceRecordSet": {
                    "name": "test.xxxx.jp",
                    "type": "TXT",
                    "tTL": 300,
                    "resourceRecords": [
                        {
                            "value": "\"test\""
                        }
                    ]
                }
            }
        ]
    }
}

おまけ

過去90日までなら、Athena で S3 のログを検索しなくても、コンソール上からイベント履歴の確認が出来ます。

Route53 はグローバルサービスなので、イベント履歴は米国東部 (バージニア北部) リージョンで検索する必要がありますのでご注意ください。出力されずにだいぶ悩みました…

Athena でも、リージョンを指定して検索する場合は、「us-east-1」になります。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.